package com.sali.repository.commons;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import java.util.List;


public class BaseServiceImpl<M extends BaseMapper<T>, T> extends ServiceImpl<M, T> implements IBaseService<T> {

    @Override
    public boolean updateStatusStr(Long id, String column, String value) {
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql(String.format("%s = %s", column, "'"+value+"'")).eq(ID, id);
        return  this.update(updateWrapper);
    }

    @Override
    public boolean updateStatus(Long id, String column, Integer value) {
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql(String.format("%s = %d", column, value)).eq(ID, id);
        return  this.update(updateWrapper);
    }

    @Override
    public boolean increById(Long id, String column) {
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql(String.format("%s = %s + 1", column, column)).eq(ID, id);
        return this.update(updateWrapper);
    }

    @Override
    public boolean increById(Long id, String column, Integer num) {
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql(String.format("%s = %s + 1", column, column))
                .gt(column, 0)
                .eq(ID, id);

        return this.update(updateWrapper);
    }

    @Override
    public boolean increById(List<Long> ids, String column) {
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql(String.format("%s = %s + 1", column, column))
                .gt(column, 0)
                .in(ID, ids);
        return this.update(updateWrapper);
    }

    @Override
    public boolean increById(List<Long> ids, String column, Integer num) {
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql(String.format("%s = %s + %d", column, column, num))
                .gt(column, 0)
                .in(ID, ids);

        return this.update(updateWrapper);
    }

    /**
     * 自减
     *
     * @param id
     */
    public boolean decreById(Long id, String column, Integer num) {
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql(String.format("%s = %s - %d", column, column, num))
                .gt(column, num)
                .eq(ID, id);

        return this.update(updateWrapper);
    }

    @Override
    public boolean decreById(List<Long> ids, String column) {
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql(String.format("%s = %s - 1", column, column))
                .gt(column, 0)
                .in(ID, ids);
        return this.update(updateWrapper);
    }

    /**
     * 自减
     *
     * @param id
     */
    public boolean decreById(Long id, String column) {
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql(String.format("%s = %s - 1", column, column))
                .gt(column, 0)
                .eq(ID, id);
        return this.update(updateWrapper);
    }


    /**
     * 自减
     * @param ids
     */
    public boolean decreById(List<Long> ids, String column, Integer num) {
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql(String.format("%s = %s - %d", column, column, num))
                .gt(column, 0)
                .in(ID, ids);

        return this.update(updateWrapper);
    }



    /**
     * 自增
     *
     * @param updateColumn 更新行
     * @param whereColumn  where条件列
     * @param whereVal     where条件值
     *                     如： update T set updateColumn = updateColumn+1 where whereColumn = whereVal
     */
    @Override
    public boolean incre(String updateColumn, String whereColumn, Long whereVal) {
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql(String.format("%s = %s + 1", updateColumn, updateColumn))
                .eq(whereColumn, whereVal);
        return this.update(updateWrapper);
    }

    /**
     * 自增
     *
     * @param updateColumn 更新行
     * @param whereColumn  where条件列
     * @param whereVal     where条件值
     *                     如： update T set updateColumn = updateColumn-1 where updateColumn >0 and  whereColumn = whereVal
     */
    @Override
    public boolean decre(String updateColumn, String whereColumn, Long whereVal) {
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql(String.format("%s = %s - 1", updateColumn, updateColumn))
                .gt(updateColumn, 0)
                .eq(whereColumn, whereVal);
        return this.update(updateWrapper);
    }

    /**
     * 自增
     *
     * @param updateColumn 更新行
     * @param whereColumn  where条件列
     * @param whereVal     where条件值
     * @param num          递减值
     *                     如： update T set updateColumn = updateColumn - num where updateColumn >= num and  whereColumn = whereVal
     */
    @Override
    public boolean decre(String updateColumn, String whereColumn, Long whereVal, Integer num) {
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql(String.format("%s = %s - %d", updateColumn, updateColumn, num))
                .ge(updateColumn, num)
                .eq(whereColumn, whereVal);
        return this.update(updateWrapper);
    }

    /**
     * 批量递减
     *
     * @param updateColumn 更新行
     * @param whereColumn  where条件列
     * @param whereVals    where条件值
     *                     如： update T set updateColumn = updateColumn - num where updateColumn >= num and  whereColumn in(whereVals)
     */
    @Override
    public boolean decre(String updateColumn, String whereColumn, List<Long> whereVals) {
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql(String.format("%s = %s - %d", updateColumn, updateColumn, 1))
                .ge(updateColumn, 0)
                .in(whereColumn, whereVals);
        return this.update(updateWrapper);
    }
}
